package modele;
import java.awt.Color;
import java.util.Vector;
import javax.swing.table.*;

import vue.panneau1.Interface2DZone1;
import vue.panneau1.Interface3DZone1;

public class TableModelEquation extends AbstractTableModel
{
	private static final long serialVersionUID = 1L;
	private Interface2DZone1 zone2D;
	private Interface3DZone1 zone3D;
	private SystemeDeSimplexe2D systemDS2D;
	private SystemeDeSimplexe3D systemDS3D;		
	private boolean is3D;	
	
	public TableModelEquation(Object interfaceZone1,boolean is3D)
	{
		if(is3D)
		{
			this.zone3D = (Interface3DZone1)interfaceZone1;
			systemDS3D = new SystemeDeSimplexe3D();
		}
		else
		{
			this.zone2D = (Interface2DZone1)interfaceZone1;
			systemDS2D = new SystemeDeSimplexe2D();
		}		
		this.is3D = is3D;
	}
	
	public String getColumnName(int n)
    {
		String s="";
        switch(n)
        {
        	case 0 : s="Equation"; break;
        	case 1 : s="Couleur"; break;
        	case 2 : s="Afficher"; break;
        }
        return s;
    }
	
	public int getRowCount() 
	{
		if(is3D)
		{
			return systemDS3D.getListeEquations().size();
		}
		else
		{
			return systemDS2D.getListeEquations().size();
		}
	}

	public int getColumnCount() 
	{	
		return 3;
	}
	
	public Class getColumnClass(int c) 
    {
        return getValueAt(0, c).getClass();
    }

	public Object getValueAt(int row, int col) 
    {
		if(is3D)
        {
			Equation3D eq = systemDS3D.getListeEquations().get(row);
			switch(col)
	        {
	        	case 0 : return "(" + (row+1) + ") " + eq.toString();
	        	case 1 : return eq.getCouleur();
	        	case 2 : return new Boolean(eq.getCochee());        	
	        }
	        return "?"; // erreur
        }
		else
		{
			Equation2D eq = systemDS2D.getListeEquations().get(row);
			switch(col)
	        {
	        	case 0 : return "(" + (row+1) + ") " + eq.toString();
	        	case 1 : return eq.getCouleur();
	        	case 2 : return new Boolean(eq.getCochee());        	
	        }
	        return "?"; // erreur
		}        
    }   
	
	 public boolean isCellEditable(int row, int col) 
	 {
	    return col == 2;
	 }
	 
	 public void setValueAt(Object value, int row, int col) 
	 {
		 if(is3D)
	     {
			 Equation3D eq = systemDS3D.getListeEquations().get(row);	        
		     switch(col)
		     {
			    case 1 : eq.setCouleur((Color)value);			 
					 	 break;
		     	case 2 : eq.setCochee(((Boolean)value).booleanValue());
		     		     // si la case est cochee
		     			 if((Boolean)value)
		     			 {
		     				 // a ajouter dans le modele
		     				 //zone3D.getZone3().getModele().ajouterEquation3D(eq);
		     			 }
		     			 else
		     			 {
		     				 // a ajouter dans le modele
		     				 //zone3D.getZone3().getModele().supprimerEquation3D(eq);
		     			 }	     			 
		     			 break;	    
		     }
	     }
		 else
		 {
			 Equation2D eq = systemDS2D.getListeEquations().get(row);	        
		     switch(col)
		     {
			    case 1 : eq.setCouleur((Color)value);			 
					 	 break;
		     	case 2 : eq.setCochee(((Boolean)value).booleanValue());
		     		     // si la case est cochee
		     			 if((Boolean)value)
		     			 {
		     				 zone2D.getZone3().getModele().ajouterEquation2D(eq);
		     			 }
		     			 else
		     			 {
		     				zone2D.getZone3().getModele().supprimerEquation2D(eq);
		     			 }	     			 
		     			 break;	    
		     }
		 }
	 }
	 
	 public void choisirLibelleContrainte(int index,String libelle)
	 {
		 if(is3D)
		 {
			 systemDS3D.ajouterLibelleContrainte(index,libelle);
		 }
		 else
		 {
			 systemDS2D.ajouterLibelleContrainte(index,libelle);
		 }
	 }
	 
	 public Equation2D getEquation2DAt(int index)
	 {
		 return systemDS2D.getListeEquations().elementAt(index);
	 }	 
	 
	 public void ajouterEquation2D(Equation2D eq)
	 {
		 systemDS2D.ajouterEquation(eq);
		 fireTableDataChanged();    	
	 }
	 
	 public void modifierEquation2D(Equation2D neweq,int index)
	 {
		 systemDS2D.modifierEquation(neweq,index);
		 fireTableDataChanged();    	
	 }	 
	 
	 public void supprimerEquation2D(int index)
	 {
		 systemDS2D.supprimerEquation(index);
		 fireTableDataChanged();
	 }
	 
	 public void setListeEquations2D(Vector<Equation2D> listeEquations)
	 {
		 systemDS2D.setListeEquations(listeEquations);
		 fireTableDataChanged();
	 }
	 
	 public void setFonctionAOptimiser2D(FonctionAOptimiser2D fct)
	 {
		 systemDS2D.setFonctionAOptimiser2D(fct);
	 }

	 public SystemeDeSimplexe2D getSystemDS2D() 
	 {
		 return systemDS2D;
	 }
	
	 public Equation3D getEquation3DAt(int index)
	 {
		 return systemDS3D.getListeEquations().elementAt(index);
	 } 
	 
	 public void ajouterEquation3D(Equation3D eq)
	 {
		 systemDS3D.ajouterEquation(eq);
		 fireTableDataChanged();    	
	 }
	 
	 public void modifierEquation3D(Equation3D neweq,int index)
	 {
		 systemDS3D.modifierEquation(neweq,index);
		 fireTableDataChanged();    	
	 }	 
	 
	 public void supprimerEquation3D(int index)
	 {
		 systemDS3D.supprimerEquation(index);
		 fireTableDataChanged();
	 }
	 
	 public void setListeEquations3D(Vector<Equation3D> listeEquations)
	 {
		 systemDS3D.setListeEquations(listeEquations);
		 fireTableDataChanged();
	 }
	 
	 public void setFonctionAOptimiser3D(FonctionAOptimiser3D fct)
	 {
		 systemDS3D.setFonctionAOptimiser3D(fct);
	 }

	public SystemeDeSimplexe3D getSystemDS3D() 
	{
		return systemDS3D;
	}
}
